El polimorfismo nos permite utilizar una clase generica para hacer que se comporte como una de sus subclases de manera que tenemos una clase que se puede comportar de varias formas.
Podemos ilustrarlo de la siguiente manera: tenemos 3 clases, una clase Persona y dos clases que descienden de Persona: Estudiante y Profesor
Dentro de la clase Persona tenemos un método estático ObtenerLongitudNombre que recibe como parámetro un objeto Persona, el polimorfismo nos permite pasarle a este método cualquiera de las subclases de Persona:
Clase Persona:
namespace PersonaApp
{
public class Persona : Object
{
protected string nombre;
public Persona()
{
}
public Persona(string nombre)
{
this.nombre = nombre;
}
public static int ObtenerLongitudNombre(Persona persona)
{
return persona.nombre.Length;
}
}
}
Clase Estudiante:
namespace PersonaApp
{
public class Estudiante : Persona
{
public string instituto;
public Estudiante(string nombre) : base(nombre)
{
}
}
}
En la aplicación principal podemos ver como le pasamos un objeto Estudiante en vez de un objeto Persona a la función:
using PersonaApp;
Estudiante estudiante = new Estudiante("Juan");
estudiante.instituto = "Instituto 1";
Console.Write(Persona.ObtenerLongitudNombre(estudiante));
Incluso podemos definir el método ObtenerLongitudNombre de la siguiente manera para utilizar campos de la clase Estudiante, como instituto en este caso:
public static int ObtenerLongitudNombre(Persona persona)
{
return ((Estudiante)persona).instituto.Length;
}
Pero en este caso si le pasasemos un objeto de tipo Profesor a la función obtendríamos una excepción ya que no se podría realizar la conversión a al tipo Estudiante:
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'ConsoleApp1.Profesor' to type 'PersonaApp.Estudiante'.
C# | Polimorfismo